package ui.login;

import app.alumnoe.AlumnoE;
import app.alumnoe.cv.CV;
import app.alumnoe.cv.beans.ExperienciaProfesional;
import app.alumnoe.cv.beans.Formacion;
import app.alumnoe.cv.beans.Idioma;
import app.alumnoe.cv.beans.Investigacion;
import app.alumnoe.cv.beans.TecnicoProfesional;
import app.alumnoe.cv.beans.TipoContratacion;
import app.empresa.Empresa;
import app.empresa.Vacante;
import app.usuario.Correos;
import app.usuario.Telefonos;
import app.usuario.Usuario;
import app.usuario.beans.Correo;
import app.usuario.beans.Telefono;
import app.util.Fecha;
import app.util.appException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import ui.alumnoInterfaz.AlumnoBean;
import ui.alumnoInterfaz.experienciaProf;
import ui.alumnoInterfaz.formacionBean;
import ui.alumnoInterfaz.idiomaBean;
import ui.alumnoInterfaz.investigacionBean;
import ui.alumnoInterfaz.tecnicoProfBean;
import ui.empresaInterfaz.EmpresaBean;
import ui.empresaInterfaz.VacanteBean;

/**
 *
 * @author charles
 */
@ManagedBean(name = "loginActionListener")
@SessionScoped
public class loginActionListener extends loginBean {

    /**
     * Esta función permite la entrada al sistema revisando las credenciales del
     * alumno
     *
     * @return AlumnoMenu en caso de éxito y login en caso de fracaso
     */
    public String userlogin() {
        try {
            //Conexion con = new Conexion();
            Usuario nuevoUsuario = Usuario.getUsuario(user, password);

            //En caso de autenticación fallida
            if (nuevoUsuario == null) {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Error de Autenticación",
                        "Ingrese el usuario y contraseña correctos."));
                return "/login.xhtml";

                // Si el nuevo usuario no es alumno y no esta activado.
            } else if (!nuevoUsuario.isbActivado() && !nuevoUsuario.getcTipoUsuario().equalsIgnoreCase("A")) {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Error de Autenticación",
                        "Podrá ingresar a la bolsa de trabajo una vez que el administrador le de de alta."));
                return "/login.xhtml";
            }

            if (nuevoUsuario.getcTipoUsuario().compareTo("A") == 0) {
                AlumnoE alumno = new AlumnoE(nuevoUsuario.getnIdUsuario());
                //subir el bean del alumno a la sesion
                cargarPerfilDeAlumno(alumno);
                return "/Alumno/AlumnoMenu?faces-redirect=true";


            } else if (nuevoUsuario.getcTipoUsuario().compareTo("E") == 0) {
                Empresa empresa = new Empresa(nuevoUsuario.getnIdUsuario());

                //Cargamos el perfil de la empresa
                cargarPerfilEmpresa(empresa);
                return "/Empresas/EmpresaMenu?faces-redirect=true";

            } else if (nuevoUsuario.getcTipoUsuario().compareTo("M") == 0) {

                // redireccionamos directamente a la página del admon.
                return "/Administrador/AdministradorMenu?faces-redirect=true";

            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Tipo de usuario Invalido",
                        "EL servidor no reconoce esta petición. Porfavor pongase en contacto con el administrador."));
                return "/login.xhtml";
            }
        } catch (appException ex) {
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Error de Autenticación",
                    "Ingrese el usuario y contraseña correctos."));
            return "/login.xhtml";
        }

    }

    /**
     * Esta función cierra la sesión inactivandola
     *
     * @return
     */
    public String logout() {
        ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
        HttpSession session = (HttpSession) ectx.getSession(false);
        session.invalidate();
        return "/login?faces-redirect=true";
    }

    private boolean cargarPerfilDeAlumno(AlumnoE alumnobd) {
        try {
            //Crear Bean de usuario
            AlumnoBean nuevoAlumno = new AlumnoBean();
            //Conexion con = new Conexion();

            //Llenamos la info básica del alumno
            nuevoAlumno.setAlumnoId(alumnobd.getnIdUsuario());
            nuevoAlumno.setNumeroCta(alumnobd.getsNumeroCuenta());
            nuevoAlumno.setNombre(alumnobd.getsNombre());
            nuevoAlumno.setApPat(alumnobd.getsApellidoPaterno());
            nuevoAlumno.setApMat(alumnobd.getsApellidoMaterno());
            nuevoAlumno.setCarreraId(alumnobd.getnCarreras());
            nuevoAlumno.setCarrera(String.valueOf(alumnobd.getnCarreras()));

            Calendar fNacCal = Calendar.getInstance();
            fNacCal.set(alumnobd.getdFechaNacimiento().getAnio(), alumnobd.getdFechaNacimiento().getMes() - 1, alumnobd.getdFechaNacimiento().getDia());
            nuevoAlumno.setFechaNac(fNacCal.getTime());

            if (alumnobd.isbEstudianteEgresado()) {
                nuevoAlumno.setEstudianteEgresado("Alumno");
            } else {
                nuevoAlumno.setEstudianteEgresado("Egresado");
            }

            nuevoAlumno.setUltimoGrado(String.valueOf(alumnobd.getnUltimoGrado()));

            //Llenamos el correo
            Correos correoClass = new Correos(alumnobd.getnIdUsuario());
            LinkedList<Correo> correosdb = correoClass.getCorreos();
            nuevoAlumno.setCorreo(correosdb.get(0).getsCorreo());
            if (correosdb.size() == 2) {
                nuevoAlumno.setCorreo2(correosdb.get(1).getsCorreo());
            }
            //Telefonos
            Telefonos telClass = new Telefonos(nuevoAlumno.getAlumnoId());
            LinkedList<Telefono> telefonosBD = telClass.getTelefonos();
            if (telefonosBD != null) {
                nuevoAlumno.setTelefono(telefonosBD.get(0).getsTelefono());
            }
            if (telefonosBD.size() == 2) {
                nuevoAlumno.setTelefono2(telefonosBD.get(1).getsTelefono());
            }

            //Llenamos las postulaciones
            LinkedList<Vacante> mispostulaciones = alumnobd.getMisVacantes();
            ArrayList<VacanteBean> postInterfaz = new ArrayList<VacanteBean>();
            for (Vacante postBd : mispostulaciones) {
                VacanteBean tmp = new VacanteBean();
                tmp.setId(String.valueOf(postBd.getnIdVacante()));
                tmp.setTitulo(postBd.getsTituloVacante());
                tmp.setDescripcion(postBd.getsDescripcion());
                tmp.setHtmlDescripcion(postBd.getHtmlVacante());
                postInterfaz.add(tmp);
            }
            nuevoAlumno.setMisPostulaciones(postInterfaz);

            //Llenamos el Curriculum

            // El INDICE DEL CV TIENE EL ID DEL USUARIO
            CV myCV = new CV(alumnobd.getnIdCV(), alumnobd.getnIdUsuario());

            if (myCV.getnIdCV() > 0) {
                nuevoAlumno.setCvId(myCV.getnIdCV());

                //Dispuesto a viajar
                if (myCV.isbDispuestoAViajar()) {
                    nuevoAlumno.setDispuestoViajar("0");
                } else {
                    nuevoAlumno.setDispuestoViajar("1");
                }

                //Dispusto a reubicarse
                if (myCV.isbDispuestoAReubicarse()) {
                    nuevoAlumno.setDispuestoReubicarse("0");
                } else {
                    nuevoAlumno.setDispuestoReubicarse("1");
                }


                //Llenamos los artículos de investigación
                LinkedList<Investigacion> articulosdb = myCV.getArticulos();
                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
                System.out.println(articulosdb);
                System.out.println("CV: " + alumnobd.getnIdCV() + " usuario:" + alumnobd.getnIdUsuario());
                System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                ArrayList<investigacionBean> invIntefaz = new ArrayList<investigacionBean>();
                for (Investigacion inv : articulosdb) {
                    invIntefaz.add(new investigacionBean(String.valueOf(inv.getnIdInvestigacion()), inv.getsReferenciaArticulo()));
                }
                nuevoAlumno.setInvestigaciones(invIntefaz);

                //Habilidades técnicas profesionales
                LinkedList<TecnicoProfesional> habTecdb = myCV.getConocimientosTecProf();
                ArrayList<tecnicoProfBean> tecProfInterfaz = new ArrayList<tecnicoProfBean>();
                for (TecnicoProfesional t : habTecdb) {
                    tecProfInterfaz.add(new tecnicoProfBean(String.valueOf(t.getnIdTecnicoProfesionales()),
                            t.getsNombreConocimiento(), t.getsNivel(), t.getsAniosExperiencia(),
                            t.getsComentarios()));
                }
                nuevoAlumno.setHabilidadesTecProf(tecProfInterfaz);

                //Falta por llenar
                LinkedList<TipoContratacion> tipContdb = myCV.getContratacion();

                //Experiencia profesional
                LinkedList<ExperienciaProfesional> expProfdb = myCV.getExperiencia();
                ArrayList<experienciaProf> exProfInterfaz = new ArrayList<experienciaProf>();
                for (ExperienciaProfesional e : expProfdb) {
                    String puestoActual = "";
                    if (e.isbPuestoActual()) {
                        puestoActual = "0";
                    } else {
                        puestoActual = "1";
                    }
                    Calendar fingreso = Calendar.getInstance();
                    fingreso.set(e.getdFechaIngreso().getAnio(), e.getdFechaIngreso().getMes() - 1, e.getdFechaIngreso().getDia());
                    Calendar fegreso = Calendar.getInstance();
                    if (e.getdFechaSalida() != null) {
                        fegreso.set(e.getdFechaSalida().getAnio(), e.getdFechaSalida().getMes() - 1, e.getdFechaSalida().getDia());
                        exProfInterfaz.add(new experienciaProf(String.valueOf(e.getnIdExperienciaProfesional()),
                                e.getsEmpresa(), e.getsPuesto(), e.getsGiro(),
                                fingreso.getTime(), fegreso.getTime(), puestoActual, e.getsFunciones()));
                    } else {
                        exProfInterfaz.add(new experienciaProf(String.valueOf(e.getnIdExperienciaProfesional()),
                                e.getsEmpresa(), e.getsPuesto(), e.getsGiro(),
                                fingreso.getTime(), null, puestoActual, e.getsFunciones()));
                    }
                }
                nuevoAlumno.setExpProfesionales(exProfInterfaz);

                //Formación académica
                LinkedList<Formacion> formaciondb = myCV.getFormaciones();
                ArrayList<formacionBean> formacionInterfaz = new ArrayList<formacionBean>();
                for (Formacion f : formaciondb) {
                    Calendar finicio = Calendar.getInstance();
                    finicio.set(f.getdFechaInicio().getAnio(), f.getdFechaInicio().getMes() - 1, f.getdFechaInicio().getDia());
                    Calendar ffin = Calendar.getInstance();
                    if (f.getdFechaFin() != null) {
                        ffin.set(f.getdFechaFin().getAnio(), f.getdFechaFin().getMes() - 1, f.getdFechaFin().getDia());
                        formacionInterfaz.add(new formacionBean(String.valueOf(f.getIdFormacion()),
                                f.getsTituloRecibido(), f.getsInstitucionEducativa(),
                                finicio.getTime(), ffin.getTime(), f.getsPromedio(), f.getsDescripcion()));
                    } else {
                        formacionInterfaz.add(new formacionBean(String.valueOf(f.getIdFormacion()),
                                f.getsTituloRecibido(), f.getsInstitucionEducativa(),
                                finicio.getTime(), null, f.getsPromedio(), f.getsDescripcion()));
                    }
                }
                nuevoAlumno.setFormaciones(formacionInterfaz);

                //Idiomas
                LinkedList<Idioma> idiomasdb = myCV.getIdiomas();
                ArrayList<idiomaBean> idiomaInterfaz = new ArrayList<idiomaBean>();
                for (Idioma i : idiomasdb) {
                    String compLec = "";
                    if (i.isComprensionLectura()) {
                        compLec = "0";
                    } else {
                        compLec = "1";
                    }
                    idiomaInterfaz.add(new idiomaBean(String.valueOf(i.getnIdIdioma()),
                            i.getsIdioma(), compLec, i.getsNivel(), i.getsInstitucionEducativa()));
                }
                nuevoAlumno.setIdiomas(idiomaInterfaz);

                //Fecha de actualización
                Fecha fechaActbd = myCV.getdFechaActualizacion();
                Calendar fact = Calendar.getInstance();
                fact.set(fechaActbd.getAnio(), fechaActbd.getMes() - 1, fechaActbd.getDia());
                if (fechaActbd != null) {
                    nuevoAlumno.setFechaActualizacion(fact.getTime());
                }

                //Fecha fin de carrera
                Fecha fechafincarrerabd = myCV.getdFechaFinalCarrera();
                if (fechafincarrerabd != null) {
                    Calendar fgrad = Calendar.getInstance();
                    fgrad.set(fechafincarrerabd.getAnio(), fechafincarrerabd.getMes() - 1, fechafincarrerabd.getDia());
                    nuevoAlumno.setFechaGrad(fgrad.getTime());
                }

                //Areas de interes
                nuevoAlumno.setAreasInteres(myCV.getsAreasInteres());

                //Creditos                              
                nuevoAlumno.setPorcentajeCreditos(myCV.getsCreditos());

                //Objetivo
                nuevoAlumno.setObjetivo(myCV.getsObjetivo());

            } else {//Si no existe el CV en la base lo debemos crear  
                Calendar cal = Calendar.getInstance();
                int day = cal.get(Calendar.DATE);
                int month = cal.get(Calendar.MONTH) + 1;
                int year = cal.get(Calendar.YEAR);
                CV newcv = new CV(nuevoAlumno.getAlumnoId(), -1, new Fecha(year, month, day),
                        "objetivo", null, "creditos", "areas interes", true, true);
                newcv.save();
                nuevoAlumno.setCvId(newcv.getnIdCV());
            }

            //Subir el Bean a la sesión
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("alumnoBean", nuevoAlumno);

            //Subir objetos de la base de datos
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("cvBD", myCV);

            //con.close();
            return true;
        } catch (appException ex) {
            Logger.getLogger(loginActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

    }

    private boolean cargarPerfilEmpresa(Empresa empresaBD) {
        try {
            EmpresaBean nuevaEmpresa = new EmpresaBean();
            nuevaEmpresa.setContacto(empresaBD.getsNombreContactoEmpresa());
            nuevaEmpresa.setCorreo(empresaBD.getsCorreo());
            nuevaEmpresa.setDescripcion(empresaBD.getsDescripcion());
            nuevaEmpresa.setIdEmpresa(String.valueOf(empresaBD.getnIdUsuario()));
            nuevaEmpresa.setNombre(empresaBD.getsNombre());
            nuevaEmpresa.setPagweb(empresaBD.getsWeb());
            nuevaEmpresa.setRfc(empresaBD.getsRFC());
            nuevaEmpresa.setTelefono(empresaBD.getsTelefono());

            for (Vacante vacbd : empresaBD.getVacantes()) {
                VacanteBean vacInt = new VacanteBean();
                if (vacbd.getnActivado()) {
                    vacInt.setActivado("Si");
                } else {
                    vacInt.setActivado("No");
                }

                vacInt.setCorreoContacto(vacbd.getsCorreo());
                vacInt.setDescripcion(vacbd.getsDescripcion());
                vacInt.setFechaPublicacion(vacbd.getdFechaPublicacion().toString());
                //vacInt.setFunciones(vacbd.get);
                vacInt.setHtmlDescripcion(vacbd.getHtmlVacante());
                vacInt.setId(vacbd.getnIdVacante() + "");
                vacInt.setInformacion(vacbd.getsInformacion());
                vacInt.setNombreContacto(vacbd.getsNombreCompletoContacto());
                vacInt.setOfrecen(vacbd.getsOfrecen());
                //vacInt.setPracProf(vacbd.get);
                vacInt.setProfBuscados(vacbd.getsProfesionalesBuscados());
                vacInt.setRequisitos(vacbd.getsRequisitos());
                //vacInt.setSalario(vacbd.get);
                vacInt.setTelefono(vacbd.getsTelefono());
                vacInt.setTitulo(vacbd.getsTituloVacante());
                vacInt.setLatitud(vacbd.getLatitud());
                vacInt.setLongitud(vacbd.getLongitud());

                nuevaEmpresa.getVacantes().add(vacInt);

            }
            //nuevaEmpresa.setVacantes(null);
            //Subir el Bean a la sesión
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("empresaBean", nuevaEmpresa);

            return true;
        } catch (appException ex) {
            Logger.getLogger(loginActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

    }
}
